iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Mobile Development

上班到一半突然被通知被炒了的我只好來寫個賓果系列 第 28

Day28 Anddroid Studio 成功翻轉螢幕,但不onCreate,動態生成的按鈕自動變換大小

  • 分享至 

  • xImage
  •  

上次我們遇到了翻轉後按鈕大小變得怪異的問題,今天就讓我們一起來克服它!
首先,我們直接用

getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){});

去偵測我們生成按鈕那個區塊的大小,也就是table的大小,然後要先設置新的按鈕大小給每個按鈕,設定完後再去印出按鈕,不然他們還是只會讀翻轉前的視窗大小,這點很重要,不要忘記了~!

然後大部分的人都會推薦最後要remove掉它,原因是如果一直動態更新視窗的話他會一直觸發,這樣會影響效能,所以才會建議用完要remove掉。
我這邊會用

getViewTreeObserver().removeOnGlobalLayoutListener(this);

來remove

大概會長這樣:
https://ithelp.ithome.com.tw/upload/images/20220922/201400634Ckcx5cahL.png

public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   m_binding.bingoTable.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
       @Override
       public void onGlobalLayout() {
           int iBingoButtonWidth = m_binding.bingoTable.getWidth() / m_iSize;
           int iBingoButtonHeight = m_binding.bingoTable.getHeight() / m_iSize;
           if (iBingoButtonHeight < iBingoButtonWidth) {//橫向
               for (int i = 0; i < m_iSize * m_iSize; i++) {
                   m_alBingoButtons.get(i).getButton().setWidth(iBingoButtonWidth);
                   m_alBingoButtons.get(i).getButton().setHeight(iBingoButtonHeight);
                   m_alBingoButtons.get(i).getButton().getLayoutParams().height = iBingoButtonHeight;
                   m_alBingoButtons.get(i).getButton().getLayoutParams().width = iBingoButtonWidth;
               }
           } else if (iBingoButtonHeight > iBingoButtonWidth) {//直向
               for (int i = 0; i < m_iSize * m_iSize; i++) {
                   m_alBingoButtons.get(i).getButton().setWidth(iBingoButtonWidth);
                   m_alBingoButtons.get(i).getButton().setHeight(iBingoButtonHeight);
                   m_alBingoButtons.get(i).getButton().getLayoutParams().height = iBingoButtonHeight;
                   m_alBingoButtons.get(i).getButton().getLayoutParams().width = iBingoButtonWidth;
               }
           }
           m_binding.bingoTable.getViewTreeObserver().removeOnGlobalLayoutListener(this);
       }
   });

}

遊戲畫面:直向轉橫向
https://ithelp.ithome.com.tw/upload/images/20220922/201400635NuXkDF0kI.png

遊戲畫面:橫向轉直向
https://ithelp.ithome.com.tw/upload/images/20220922/20140063dzSWrFV1pg.png

這樣就能順利在翻轉螢幕後順利改變按鈕大小啦,如果有什麼其他的方法也歡迎跟我分享

by the way之前做過一件蠢事,想說讓他分模式去重新生成按鈕跟按鈕裡面的數字,畢竟數字會另外記在陣列裡,這樣也是可以偵測直向橫向,但也僅限於輸入模式,如果要把這個方式套到遊戲模式會有很多問題會需要去解決,按鈕是否被點擊的判斷跟連線數都會受到影響,感覺像是繞了一大圈才解決這件事,所以後來才去用getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){});
去解決這件事情。


上一篇
Day27 離翻轉螢幕,但不onCreate更近了一步
下一篇
Day29 Android Studio 賓果後續改進方向
系列文
上班到一半突然被通知被炒了的我只好來寫個賓果30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言